原文地址:http://docs.eoeandroid.com/guide/topics/ui/controls/button.html
译文地址:http://wiki.eoeandroid.com/Buttons
目录 |
按键 – Buttons
按钮包括文字或者图标,或者两者兼而有之,当用户触摸到按钮时就会触发事件。
取决于你需要按钮有文本、图标或两者兼而有之,您可以以三种方式创建按钮布局:
需要有文字的按钮,使用<Button>类:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_text"
... />
需要有图标的按钮,使用<ImageButton>类:
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/button_icon"
... />
需要有文字和图标的按钮,使用具有android:drawableLeft属性的<Button>类:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_text"
android:drawableLeft="@drawable/button_icon"
... />
点击事件的响应 – Responding to Click Events
当用户点击一个按钮时,<Button>对象就会收到一个单击事件。
为了定义一个按钮的点击事件处理程序,在XML布局中为<button>元素添加<android:onClick>属性。这个属性的值必须是你要调用的方法响应点击事件的名称。 使用这个布局的<Activity>必须执行相应的方法。
例如,这里有一个使用<android:onClick>属性的按钮的布局:
<?xml version="1.0" encoding="utf-8"?> <Button xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/button_send" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button_send" android:onClick="sendMessage" />
在使用这个布局的<Activity>中,利用下面的方法处理点击事件:
/** Called when the user touches the button */ public void sendMessage(View view) { // Do something in response to button click }
在<android:onClick>属性声明的方法必须完全按照上面显示。具体来说,该方法必须:
是公共的
返回void
定义一个<View>作为其唯一的参数(点击时将会看作这个<View>)
使用监听器 – Using an OnClickListener
您也可以声明单击事件处理程序,而不是在XML布局中。这可能是必要的,如果你在运行时实例化<Button>,或者你需要在一<Fragment>子类中声明单击事件。
为了声明事件处理程序,创建一个<View.OnClickListener>对象,并通过调用<setOnClickListener(View.OnClickListener)>分配给按钮。例如:
Button button = (Button) findViewById(R.id.button_send); button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // Do something in response to button click } });
按钮的样式 – Styling Your Button
按钮的外观(背景图片和字体)可能会因为机器不同而有所不同,因为不同厂家的设备的输入控件的默认样式往往不同。
您可以控制控件使用适用于整个应用程序的样式。例如,要确保所有运行Android4.0甚至更高版本的设备在您的应用程序使用Holo主题,需要在manifest的 <application>元素中声明android:theme=”@android:style/Theme.Holo”。通过阅读博客文章得知,Holo Everywhere使用了Holo的主题,同时支持低版本的设备。
为了给按钮定制不同的背景,指定<android:background>属性为可绘制或彩色的资源。另外,您可以使用一种类似于HTML的样式来定义按钮的样式,可以定义多种属性,如背景、字体、大小等等。关于应用样式的更多信息,请参阅<Styles and Themes>。
一种有用的设计是无边框按钮。无边框按钮与基本按钮相似,但是无边框按钮没有无边框或背景,但在不同状态如点击时,会改变外观。
要创建一个无边框“按钮,为按钮应用<borderlessButtonStyle>样式。例如:
<Button android:id="@+id/button_send" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button_send" android:onClick="sendMessage" style="?android:attr/borderlessButtonStyle" />
定制背景 – Custom background
如果你想真正重新定义按钮的外观,你可以指定一个自定义的背景。而不是提供一个简单的位图或颜色,然而,你的背景应该是一个状态列表资源,取决于按钮的当前状态而改变外观,。
您可以在一个XML文件中定义状态列表,定义三种不同的图像或颜色,用于不同的按钮状态。
要为按钮的背景创建一个状态列表资源:
创建三个按钮背景位图以表示默认、按下和选中的按钮状态。
为了确保图像适合不同大小的按钮,以<9-patch>的格式创建图像。
位图放到你工程的res/drawable/ directory。确保每个位图命名正确能够反映它们分别代表的按钮状态,如button_default.9.png、button_pressed.9.png以及button_focused.9.png。
在res/drawable/ directory下创建一个新的XML文件(命名类似于button_custom.xml)。使用下面的XML:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/button_pressed" android:state_pressed="true" /> <item android:drawable="@drawable/button_focused" android:state_focused="true" /> <item android:drawable="@drawable/button_default" /> </selector>
这定义一个单一的绘制资源,将基于按钮的当前状态改变其图像。
第一个<item>定义了按下按钮(激活)时使用的位图。
第二个<item>定义了按钮按下时(按钮高亮时,使用轨迹球或方向键)使用的位图。
第三个<item>定义了默认状态下的按钮(既不是按下也不是选中)使用的位图。
注意:<item>元素的顺序是重要的。当图像可用时,按顺序遍历<item>元素,以确定哪一个适合当前按钮状态。因为默认的位图在最后,当android:state_pressed 和android:state_focused的值都为false时才会被应用。
现在这个XML文件代表一个单一的绘制资源,当<Button>引用它作为背景,图像将基于按钮的三种状态而改变。
然后,只需应用此XML文件作为按钮的背景:
<Button android:id="@+id/button_send" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button_send" android:onClick="sendMessage" android:background="@drawable/button_custom" />
对于此XML语法的更多详细信息,包括如何定义一个非使能、不确定的或其他的按钮状态,阅读<State List Drawable>。